package elastic.log.httpclientasync;

import org.apache.http.HttpResponse;
import org.apache.http.client.utils.HttpClientUtils;
import org.apache.http.concurrent.FutureCallback;
//import zhbg.oaxt.elastic.SearchErrorHanlder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * @author Jeffrey
 * @version 1.0
 * @project 深圳OA
 * @package zhbg.oaxt.httpclientasync
 * @file 创建时间:2018/7/31 15:39
 * @title 标题（要求能简洁地表达出类的功能和职责）
 * @description 描述（简要描述类的职责、实现方式、使用注意事项等）
 * @copyright Copyright (c) 2018 中国软件与技术服务股份有限公司
 * @company 中国软件与技术服务股份有限公司
 * @module 模块: 模块名称
 * @reviewer 审核人
 * @history 修订历史（历次修订内容、修订人、修订时间等）
 */
public class AsyncHttpCallback implements FutureCallback<HttpResponse> {

    /**
     * 日志
     */
    private static Logger log = LoggerFactory.getLogger(AsyncHttpCallback.class);

    /**
     * url
     */
    private String operation;
    /**
     * url
     */
    private String url;
    /**
     * index
     */
    private String index;
    /**
     * id
     */
    private String id;
    /**
     * value
     */
    private String value;
    /**
     * retryNo 重试次数
     */
    private int retryNo;

    /**
     * 构造方法
     *
     * @param operation operation
     * @param url       url
     * @param index     index
     * @param value     value
     * @param id        id
     * @param retryNo   retryNo
     */
    public AsyncHttpCallback(String operation, String url, String index, String id, String value, int retryNo) {
        this.operation = operation;
        this.url = url;
        this.index = index;
        this.id = id;
        this.value = value;
        this.retryNo = retryNo;
    }

    /**
     * 调用成功
     *
     * @param response response
     */
    @Override
    public void completed(HttpResponse response) {
        HttpClientUtils.closeQuietly(response);
    }

    /**
     * 调用失败
     *
     * @param e 异常
     */
    @SuppressWarnings("unchecked")
    @Override
    public void failed(Exception e) {
        log.info("======发送async http post请求失败======", e);

        // 记录到数据库
        if (null != value) {
            // 重试3次
            if (retryNo < AsyncHttpProxy.maxRetryTimes) {
                AsyncHttpProxy.getAsyncHttpProxy().httpPost(operation, url, index, id, value, ++retryNo);
            }/* else {
                new SearchErrorHanlder().saveError(operation, index, id, value, e);
            }*/
        }

    }

    /**
     * 调用取消
     */
    @Override
    public void cancelled() {
        log.info("======发送async http post请求取消======");
    }

}
